#ifndef _MY_UTILITY_
#define _MY_UTILITY_
/*
    工具类
*/
#include"log.hpp"
#include<unistd.h>
  #include <sys/types.h>
       #include <sys/socket.h>
#include<string>
extern Log lg;
class Utility
{
    public:
    //读取一行行以 '\n'结尾
    static int GetLine(const int&fd,std::string&out)
    {
        char ch='x';
        while(ch!='\n')
        {
          ssize_t n=  recv(fd,&ch,1,0);
          if(n>0)
          {
            if(ch=='\r')//有些浏览器的请求结尾以'\r' 或'\n' 或'\r\n' 统一处理成'\n'
            {
                //看看它下一个是否'\n'，看但先不从传输层的接收缓冲区读取上来，如果是则读取
                recv(fd,&ch,1,MSG_PEEK);//读上来的ch会修改但还在传输层
                if(ch=='\n')
                {
                    recv(fd,&ch,1,0);
                }
                else
                {
                    ch='\n';
                }
            }
            out.push_back(ch);
          }
          else if(n==0)
          {
            //写端关闭
            lg(INFO,__LINE__," Write Close");
            return -1;
          }
          else
          {
            //读取出错
            lg(ERROR,__LINE__,"Read Error!!");
            return -2;
          }
        }
        return 0;//读取成功
    }   
    //切割字符串方法，作用：把一个目标字符串以分隔符切割为str1，str2
    static bool CutString(const std::string&target,std::string&str1,std::string&str2,const std::string&sep)
    {
     size_t pos= target.find(sep);
     if(pos!=std::string::npos)
     {
      //找到了-> ": "左边为k，右边为v
      str1=target.substr(0,pos);
      str2=target.substr(pos+sep.size());
      return true;
     }
     //找不到
      return false;
    }
};

#endif